#include "SList.h"
SListNode* BuySListNode(Class a)
{
	SListNode* tmp = (SListNode*)malloc(sizeof(SListNode));
	assert(tmp);
	tmp->data = a;
	tmp->next = NULL;
	return tmp;
}

void SListPushBack(SListNode** pp, Class a)
{
	assert(pp);

	if (*pp == NULL)
	{
		*pp = BuySListNode(a);
	}
	else
	{
		SListNode* tmp = *pp;
		
		while (tmp->next)
		{
			tmp = tmp->next;
		}
		tmp->next = BuySListNode(a);
	}
}
void SLidtPushFront(SListNode** pp, Class a)
{
	assert(pp);
	SListNode* tmp = *pp;
	*pp = BuySListNode(a);
	(*pp)->next = tmp;
}
SListNode* SListFind(SListNode* pp, Class a)
{
	assert(pp);
	SListNode* tmp = pp;
	while (tmp)
	{
		if (tmp->data == a)
			return tmp;
		tmp = tmp->next;
	}
	return NULL;
}
void SListInsertAfter(SListNode* pos, Class a)
{
	assert(pos);
	SListNode* tmp = pos->next;
	pos->next = BuySListNode(a);
	pos->next->next = tmp;
}
void SListPopBack(SListNode** pp)
{
	assert(pp);
	assert(*pp);
	SListNode* tmp = *pp;
	SListNode* cur1 = NULL;
	SListNode** cur = pp;

	while (tmp->next != NULL)
	{
		cur1 = tmp;
		tmp = tmp->next;
		cur = NULL;
	}
	free(tmp);
	if (cur != NULL)
	{
		*pp = NULL;
	}
	else
	{
		cur1->next = NULL;
	}
	
}
void SListPopFront(SListNode** pp)
{
	assert(pp);
	assert(*pp);
	SListNode* tmp = *pp;
	*pp = (*pp)->next;
	free(tmp);
}
void SListEraseAfter(SListNode* pos)
{
	assert(pos);
	if (pos->next)
	{
		SListNode* tmp = pos->next->next;
		free(pos->next);
		pos->next = tmp;
	}
	
}
void SListPrint(SListNode* pp)
{
//	assert(pp);
	SListNode* tmp = pp;
	while (tmp)
	{
		printf("%d->", tmp->data);
		tmp = tmp->next;
	}
	printf("NULL\n");
}
void SListModfiy(SListNode* pp, Class a)
{
	assert(pp);
	pp->data = a;
}
void SListDestory(SListNode** pp)
{
	assert(pp);
	assert(*pp);
	SListNode* tmp = *pp;
	SListNode* cur = NULL;
	while (tmp)
	{
		cur = tmp;
		tmp = tmp->next;
		free(cur);
	}
	*pp = NULL;
}

int main()
{
	SListNode* a = NULL;
	SListPushBack(&a, 0);
	SListPushBack(&a, 1);
	SListPushBack(&a, 2);
	SListPushBack(&a,3);
	SListPrint(a);
	//SListEraseAfter(SListFind(a, 3));
	SListModfiy(SListFind(a, 3), 30);
	SListPrint(a);
	SListDestory(&a);
	SListPrint(a);


	/*SListPopFront(&a);
	SListPopFront(&a);
	SListPopFront(&a);
	SListPopFront(&a);
	SListPopFront(&a);*/

	/*SListPopBack(&a);
	SListPopBack(&a);
	SListPopBack(&a);
	SListPopBack(&a);
	SListPopBack(&a);*/

	//SLidtPushFront(&a, 0);
	//SLidtPushFront(&a, 1);
	//SLidtPushFront(&a, 2);
	//SLidtPushFront(&a, 3);
	////printf("%d\n", SListFind(a, 0)->data);
	//SListInsertAfter(a, -1);
	//SListInsertAfter(SListFind(a, 0), 50);
	//SListInsertAfter(SListFind(a, 2), 60);

	return 0;
}
